// package org.zebra.mybatis.plus.ext.apt;
//
// import com.baomidou.mybatisplus.annotation.TableField;
// import org.zebra.mybatis.plus.ext.redundancy.util.TableColumnNameUtil;
//
// import javax.annotation.processing.Filer;
// import javax.annotation.processing.Messager;
// import javax.lang.model.element.*;
// import javax.lang.model.type.TypeMirror;
// import javax.lang.model.util.Elements;
// import javax.lang.model.util.Types;
// import javax.tools.JavaFileObject;
// import java.io.PrintWriter;
// import java.util.Set;
// import java.util.stream.Collectors;
//
/// **
// * @author zhanghongbin
// */
// public class DomainConstantBuilder {
//
//    private final Types typeUtils;
//    private final Elements elementUtils;
//
//    private Filer filer;
//    private Messager messager;
//
//    public DomainConstantBuilder(Filer filer, Messager messager, Types typeUtils, Elements elementUtils) {
//        this.filer = filer;
//        this.messager = messager;
//        this.typeUtils = typeUtils;
//        this.elementUtils = elementUtils;
//    }
//
//    public void buildDefine(TypeElement classElement) {
//        // 获取当前类中的所有字段
//
//        Set<Element> fields = classElement.getEnclosedElements().stream()
//                .filter(e ->
//                        e.getKind() == ElementKind.FIELD && !e.getModifiers().contains(Modifier.STATIC))
//                .collect(Collectors.toSet());
//        // 检索父类中的可用字段
//        TypeMirror superClassMirror = classElement.getSuperclass();
//        while (!superClassMirror.toString().equals(Object.class.getName())) {
//            TypeElement superClassElement = (TypeElement) typeUtils.asElement(superClassMirror);
//            fields.addAll(superClassElement.getEnclosedElements().stream()
//                    .filter(e -> {
//                        Set<Modifier> modifiers = e.getModifiers();
//                        return e.getKind() == ElementKind.FIELD
//                                && modifiers.contains(Modifier.PROTECTED)
//                                && !modifiers.contains(Modifier.STATIC);
//                    })
//                    .collect(Collectors.toSet()));
//            superClassMirror = superClassElement.getSuperclass();
//        }
//        String suffix = "ConstantGen";
//        String className = classElement.getSimpleName().toString() + suffix;
//        String entityPackageName =
//                elementUtils.getPackageOf(classElement).getQualifiedName().toString();
//        String packageName = entityPackageName + ".gen";
//        packageName = getTargetPackageName(entityPackageName, packageName);
//        try {
//            JavaFileObject file = this.filer.createSourceFile(packageName + "." + className);
//            try (PrintWriter writer = new PrintWriter(file.openWriter())) {
//                writer.println("package " + packageName + ";");
//                writer.println();
//                writer.println("public interface " + className + " {");
//                for (Element field : fields) {
//                    VariableElement variableElement = (VariableElement) field;
//                    String fieldName = variableElement.getSimpleName().toString();
//                    TableField tableField = variableElement.getAnnotation(TableField.class);
//                    String fieldValue;
//                    if (tableField == null) {
//                        fieldValue = TableColumnNameUtil.smartConvert(true, fieldName);
//                    } else {
//                        fieldValue = tableField.value().equals("")
//                                ? TableColumnNameUtil.smartConvert(true, fieldName)
//                                : tableField.value();
//                    }
//                    writer.println("    String " + fieldName.toUpperCase() + " = \"" + fieldValue + "\";");
//                }
//                writer.println("}");
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
//
//    private String getTargetPackageName(String entityPackagePath, String customPackagePath) {
//        // 默认使用entity所在目录
//        String packageName = entityPackagePath;
//        if (!"".equals(customPackagePath)) {
//            String basePackageName;
//            // 相对路径配置
//            if (customPackagePath.startsWith(".")) {
//                // 先去掉第一个.，赋值当前entity所在目录
//                customPackagePath = customPackagePath.substring(1);
//                basePackageName = entityPackagePath;
//                // 后续如果仍有.，则向上取一层
//                while (customPackagePath.startsWith(".")) {
//                    // 去除.
//                    customPackagePath = customPackagePath.substring(1);
//                    // 基本路径去掉最后一层
//                    int lastIndexOfPoint = basePackageName.lastIndexOf('.');
//                    if (lastIndexOfPoint != -1) {
//                        basePackageName = basePackageName.substring(0, lastIndexOfPoint);
//                    } else {
//                        basePackageName = "";
//                    }
//                }
//                if (!customPackagePath.isEmpty() && !basePackageName.isEmpty()) {
//                    customPackagePath = "." + customPackagePath;
//                }
//                packageName = basePackageName + customPackagePath;
//            } else {
//                // 绝对路径配置
//                packageName = customPackagePath;
//            }
//        }
//        return packageName;
//    }
// }
